/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.vista.implementaciones;

import desarrollosoft.ghce.entidades.Consulta;
import desarrollosoft.ghce.entidades.Gravedad;
import desarrollosoft.ghce.entidades.Paciente;
import desarrollosoft.ghce.servicio.interfaces.IParserExcepciones;
import desarrollosoft.ghce.servicio.interfaces.IServicioHistorial;
import desarrollosoft.ghce.soporte.SecurityUtil;
import desarrollosoft.ghce.vista.interfaces.Actualizable;
import desarrollosoft.ghce.vista.interfaces.Avisable;
import desarrollosoft.ghce.vista.interfaces.Estado;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.AfterCompose;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

/**
 *
 * @author ariel
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ControladoraVentanaConsulta implements Avisable {
    
    @WireVariable("servicioHistorial")
    private IServicioHistorial servicioHistorial;
    
    @WireVariable("parserExcepcionesElemento")
    private IParserExcepciones parserExcepciones;
    
    private String nombreUsuario;
    
    private Paciente paciente;
    
    private Consulta consulta;
    
    private Consulta consultaAnterior; // por si cancelan los cambios en una modificacion
    
    private boolean camposEditables;
    
    private Actualizable actualizable;
    
    private Estado estado;
    
    private List<Gravedad> listaGravedades;
    
    @Init
    public void inicializar() {
        Execution ejecucion = Executions.getCurrent();
        paciente = (Paciente) ejecucion.getArg().get("paciente");
        consulta = (Consulta) ejecucion.getArg().get("consulta");
        actualizable = (Actualizable) ejecucion.getArg().get("actualizable");
        estado = (Estado) ejecucion.getArg().get("estado");
        
        nombreUsuario = SecurityUtil.getUserName();
        listaGravedades = servicioHistorial.obtenerTodasGravedades(); // cargo la lista de gravedades
        
        if (estado.equals(Estado.CREANDO)) {
            consulta = new Consulta();
            consulta.setPaciente(paciente);
            camposEditables = true;
        } else if (estado.equals(Estado.CONSULTANDO)) {
            camposEditables = false;
        } else if (estado.equals(Estado.MODIFICANDO)) {
            consultaAnterior = consulta.clonar();
            camposEditables = true;
        }
    }
    
    @AfterCompose
    public void hacerDespuesDeDibujar() {
        
    }
    
    public String getNombreDiagnostico() {
        if (consulta.getDiagnostico() == null) {
            return null;
        }
        return consulta.getDiagnostico().getNombre();
    }
    
    public List<Gravedad> getListaGravedades() {
        return listaGravedades;
    }
    
    public Consulta getConsulta() {
        return consulta;
    }
    
    public boolean getCamposEditables() {
        return camposEditables;
    }
    
    @NotifyChange({"camposEditables"})
    @Command("guardar")
    public void clickBotonGuardar() {
        if (estado.equals(Estado.CREANDO)) {
            try {
                servicioHistorial.crearConsulta(consulta, nombreUsuario);
                camposEditables = false;
                actualizable.guardaronVentanaHija(consulta);
            } catch (Exception ex) {
                Messagebox.show(parserExcepciones.parsear(ex.toString()));
                //actualizable.guardaronVentanaHija(null);
            }
        } else if (estado.equals(Estado.MODIFICANDO)) {
            try {
                servicioHistorial.modificarConsulta(consulta, nombreUsuario);
                camposEditables = false;
                actualizable.guardaronVentanaHija(consulta);
            } catch (Exception ex) {
                Messagebox.show(parserExcepciones.parsear(ex.toString()));
                actualizable.guardaronVentanaHija(null);
            }
        }
    }
    
    @Command("cancelar")
    public void clickBotonCancelar(){
        if (estado.equals(Estado.CREANDO)) {
            consulta = new Consulta();
            consulta.setPaciente(paciente);
            camposEditables = false;
            actualizable.cancelaron();
        } else {
            setearParametros(consulta,consultaAnterior);
            camposEditables = false;
        }
        BindUtils.postNotifyChange(null,  null, this, "*");
    }
    
    /**
     * Setea los parametros de la consulta actual segun la consulta anterior
     * @param consultaActual
     * @param consultaAnterior 
     */
    private void setearParametros(Consulta consultaActual, Consulta consultaAnterior) {
        consultaActual.setId(consultaAnterior.getId());
        consultaActual.setFecha(consultaAnterior.getFecha());
        consultaActual.setFechaFin(consultaAnterior.getFechaFin());
        consultaActual.setGravedad(consultaAnterior.getGravedad());
        consultaActual.setAnamnesis(consultaAnterior.getAnamnesis());
        consultaActual.setDiagnostico(consultaAnterior.getDiagnostico());
        consultaActual.setExamenFisico(consultaAnterior.getExamenFisico());
        consultaActual.setProfesional(consultaAnterior.getProfesional());
    }
    
    @Command("buscarDiagnostico")
    public void clickBotonBuscarDiagnostico(){
        Map<String,Object> argumentos = new HashMap<>();
        argumentos.put("avisable", this);
        argumentos.put("consulta", consulta);
        Window ventana = (Window) Executions.createComponents("VentanaBusquedaDiagnostico.zul", null, argumentos);
        ventana.doModal();
    }
    
    @Override
    public void seCerroVentanaHija(String nombre) {
        BindUtils.postNotifyChange(null,  null, this, "*");
    }
}
